import { Service } from 'egg';

/**
 * User Service
 */
export default class User extends Service {
  // 登录处理
  public async getUser({ username, email, phone, password }) {
    // 先把密码加密了再去查
    password = this.ctx.helper.encryptText(password);
    let res;
    // 如果用户输入的是邮箱账号,则执行邮箱的逻辑不判断下面的了
    if (email) {
      res = await this.findUser({ email, password });
      // 如果用户输入的是手机账号,则执行手机的逻辑不判断下面的了
    } else if (phone) {
      res = await this.findUser({ phone, password });
      // 最后在执行普通账号的
    } else if (username) {
      res = await this.findUser({ username, password });
    }
    try {
      // 过滤掉为null的值
      const user = res.dataValues;
      Object.keys(user).forEach(key => {
        if (!user[key]) delete user[key];
      });
      delete user.password;
      return user;
    } catch (e) {
      throw new Error('用户名或密码不正确');
    }
  }
  public async createUser(obj) {
    const { username, email, phone, password } = obj;
    // 先把密码加密在存入数据库
    obj.password = this.ctx.helper.encryptText(password);
    if (username) {
      // 普通注册
      return await this.createUserByUserName(username, obj); // data.dataValues;
    } else if (email) {
      // 邮箱注册
      return await this.createUserByEmailName(email, obj); // data.dataValues;
    } else if (phone) {
      // 手机注册
    }
  }


  // 普通用户添加
  private async createUserByUserName(username, obj) {
    // 1.查询当前用户是否存在
    const user = await this.findUser({ username });
    if (user) {
      throw new Error('当前用户已存在');
    }
    // 如果不存在则保存到数据库中
    const data = await this.ctx.model.User.create(obj);
    // console.log(data.dataValues);
    // 返回存储信息给客户端
    const userData = data.dataValues;
    delete userData.password;
    return userData;
  }
  // 邮箱用户添加
  private async createUserByEmailName(email, obj) {
    // 1.查询当前用户是否存在
    const user = await this.findUser({ email });
    if (user) {
      throw new Error('当前用户已存在');
    }
    // 如果不存在则保存到数据库中
    const data = await this.ctx.model.User.create(obj);
    // console.log(data.dataValues);
    // 返回存储信息给客户端
    const userData = data.dataValues;
    delete userData.password;
    return userData;
  }
  // 查询数据库中有没有当前用户
  private async findUser(options) {
    return await this.ctx.model.User.findOne({ where: options });
  }
}
